package com.algorithm.liyc.practice;

import java.util.Deque;
import java.util.LinkedList;

/**
 * 逆波兰表达式求值
 *
 * 根据 逆波兰表示法，求表达式的值。
 * 有效的运算符包括 + ,  - ,  *  ,  / 。每个运算对象可以是整数，也可以是另一个逆波兰表达式。
 * 说明：
 * 整数除法只保留整数部分。
 * 给定逆波兰表达式总是有效的。换句话说，表达式总会得出有效数值且不存在除数为 0 的情况。
 *
 * @author Liyc
 * @date 2023/12/20 17:21
 **/

public class Solution35 {

    public int evalRPN(String[] tokens) {
        Deque<Integer> deque = new LinkedList<>();
        for (String s : tokens) {
            // 注意 - 和/ 需要特殊处理
            if ("+".equals(s)) {
                deque.push(deque.pop() + deque.pop());
            } else if ("-".equals(s)) {
                deque.push(-deque.pop() + deque.pop());
            } else if ("*".equals(s)) {
                deque.push(deque.pop() * deque.pop());
            } else if ("/".equals(s)) {
                int tmp1 = deque.pop();
                int tmp2 = deque.pop();
                deque.push( tmp2 / tmp1);
            } else {
                deque.push(Integer.valueOf(s));
            }
        }
        return deque.pop();
    }
}
